package _24_二叉树中和为某一值的路径;

import java.util.ArrayList;

/**
 * 题目描述
 * 输入一颗二叉树的跟节点和一个整数，打印出二叉树中结点值的和为输入整数的所有路径。
 * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
 * (注意: 在返回值的list中，数组长度大的数组靠前)
 */
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}

public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();

        ArrayList<Integer> list = new ArrayList<>();
        find(root,target,res,list);
        return res;
    }

    void find(TreeNode root, int target, ArrayList<ArrayList<Integer>> res, ArrayList<Integer> list) {
        //如果根为空，或者其值大于
        if (root == null ) {
            return;
        }
        target -=root.val;
       // ArrayList<Integer> tmp = new ArrayList<>(list);

        list.add(root.val);
        if (0 == target &&root.left==null &&root.right==null) {

            res.add(list);
            return;
        }
        find(root.left,target,res,list);
        find(root.right,target,res,list);
        list.remove(list.size()-1);

    }

    public static void main(String[] args) {
        Solution solution =new Solution();
        TreeNode root = new TreeNode(10);
        root.left = new TreeNode(5);
        root.right = new TreeNode(12);
        root.left.left = new TreeNode(7);
        root.left.right = new TreeNode(8);
        solution.FindPath(root,22);
    }
}